home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / gnuish / ispel40s / ispell.c < prev    next >
C/C++ Source or Header  |  1993-09-24  |  31KB  |  972 lines

  1. /* Copyright (C) 1990, 1993  Free Software Foundation, Inc.
  2.  
  3.    This file is part of GNU ISPELL.
  4.  
  5.    This program is free software; you can redistribute it and/or modify
  6.    it under the terms of the GNU General Public License as published by
  7.    the Free Software Foundation; either version 2, or (at your option)
  8.    any later version.
  9.  
  10.    This program is distributed in the hope that it will be useful,
  11.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.    GNU General Public License for more details.
  14.  
  15.    You should have received a copy of the GNU General Public License
  16.    along with this program; if not, write to the Free Software
  17.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  18.  
  19. /* ISPELL is an interactive spelling corrector generates a list
  20.    of near misses for each misspelled word.  The direct parantage
  21.    of this version seems to have begun in California in the
  22.    early 70's.  A child of that version was known as SPELL on
  23.    the MIT ITS systems, and later ISPELL on MIT TOPS-20 systems.
  24.    I wrote the first C implementation in 1983, and then developed
  25.    this version in 1988.  See the History section of ispell.texinfo
  26.    for more information.
  27.  
  28.    Pace Willisson
  29.    pace@ai.mit.edu  pace@hx.lcs.mit.edu
  30.    (617) 625-3452
  31.  
  32.    See ChangeLog for further author information. */
  33.  
  34.  
  35. #ifdef __MSDOS__
  36. #undef __STDC__          /* I need not ANSI function to emulate pipes */
  37. #include <stdlib.h>
  38. #include <stdio.h>
  39. #include <io.h>                       /* access () */
  40. #include <process.h>                  /* spawnl () */
  41. /* #include "msdos.h" */
  42. #define __STDC__ 1
  43. #endif
  44.  
  45.  
  46. #include <stdio.h>
  47. #include <ctype.h>
  48. #include <signal.h>
  49.  
  50. #ifdef HAVE_MALLOC_H
  51. #include <malloc.h>
  52. #endif
  53.  
  54.  
  55. #include "getopt.h"
  56.  
  57.  
  58. #if defined ( DICT_LIB )
  59. char *dict_lib = DICT_LIB;
  60. #elif ! defined (  MSDOS )
  61. char *dict_lib = "/usr/dict";
  62. #else
  63. /*
  64.   for IBM PC Borland/TurboC compiler the default directory
  65.   for the dictionary is the same as ispell.exe file.
  66.  
  67.   DJGPP port does not have full path in argv[0] thus we should define DICT_LIB
  68.   variable or use it expilcitly in the command line
  69. */
  70. char dict_lib[256]= "";
  71. #endif
  72.  
  73.  
  74. #include "ispell.h"
  75. #include "hash.h"
  76. #include "charset.h"
  77.  
  78. static void show_warranty (NOARGS);
  79. static void show_copying (NOARGS);
  80. static void show_signon (NOARGS);
  81.  
  82. /* char **lexdecode = NULL;        duplicate with built.c */
  83.  
  84. /* this array contains letters to use when generating near misses */
  85. char near_miss_letters[256];
  86. int nnear_miss_letters;
  87.  
  88. /* this array has 1 for any character that is in near_miss_letters */
  89. char near_map[256];
  90.  
  91. enum formatter formatter;
  92.  
  93. /* set to 1 if any interaction takes place */
  94. int interaction_flag = 1;
  95.  
  96. int lflag;
  97. int aflag;
  98. int dflag;
  99. int pflag;
  100. int Sflag;
  101. int askflag;
  102. int Dflag;
  103. int Eflag;
  104. int hflag;
  105. int uflag;
  106. int iflag;
  107. char *dname;
  108. char *privname;
  109. int intr_typed;
  110.  
  111. FILE *sortf;
  112.  
  113.  
  114. void
  115. usage ()
  116. {
  117.   (void) fprintf (stderr, "Usage: ispell [-d dict] [-p privdict] file\n");
  118.   (void) fprintf (stderr, "or:    ispell [-a | -l]\n");
  119.   exit (1);
  120. }
  121.  
  122.  
  123. RETSIGTYPE
  124. intr ()
  125. {
  126.   signal (SIGINT, (RETSIGTYPE (*)()) intr);
  127.   intr_typed = 1;
  128. }
  129.  
  130.  
  131. void
  132. done ()
  133. {
  134.   extern char tempfile[];
  135.  
  136.   if (tempfile[0])
  137.     {
  138.       (void) unlink (tempfile);
  139.       tempfile[0] = 0;
  140.     }
  141.   termuninit ();
  142.   exit (0);
  143. }
  144.  
  145.  
  146. int
  147. main (argc, argv)
  148.   int argc;
  149.   char **argv;
  150. {
  151.   int c;
  152.   extern char *optarg;
  153.   extern int optind;
  154.   char *p;
  155.   int i;
  156.  
  157.   for (i = 0; i < 256; i++)
  158.     if (charset[i].word_component)
  159.       (ctbl + 1)[i] |= LEXLETTER;
  160.  
  161.   /* if invoked by the name 'spell', set uflag */
  162.   if ((p = (char *) strrchr (argv[0], '/')))
  163.     p++;
  164.   else
  165.     p = argv[0];
  166.  
  167.   if (strcmp (p, "spell") == 0)
  168.     {
  169.       uflag = 1;
  170.       lflag = 1;
  171.     }
  172.  
  173.   formatter = formatter_generic;
  174.  
  175.   while ((c = getopt (argc, argv, "alp:d:SDEhuvbixtWC")) != EOF)
  176.     {
  177.       switch (c)
  178.     {
  179.     case 'W':
  180.       show_warranty ();
  181.       exit (0);
  182.     case 'C':
  183.       show_copying ();
  184.       exit (0);
  185.     case 't':
  186.       formatter = formatter_tex;
  187.       break;
  188.       /* traditional spell options */
  189.       /* ignore these */
  190.     case 'v':               /* don't trust original suffix stripper */
  191.     case 'b':               /* check british spelling */
  192.       break;
  193.     case 'i':               /* don't follow any .so's or .nx's */
  194.       iflag = 1;
  195.       break;
  196.       /* case 'l': */
  197.       /* follow nroff .so's, and .nx's into /usr/lib */
  198.       /* in ispell, this means make a list.  luckily,
  199.              * if the user wants old style, lflag is turned
  200.              * on anyway
  201.              */
  202.  
  203.     case 'x':               /* print stems with '='s */
  204.       (void) fprintf (stderr, "-x is not supported\n");
  205.       exit (1);
  206.  
  207.       /* end of traditional options */
  208.  
  209.     case 'u':
  210.       uflag = 1;
  211.       lflag = 1;
  212.       break;
  213.     case 'h':
  214.       hflag = 1;
  215.       break;
  216.     default:
  217.       usage ();
  218.     case 'D':
  219.       Dflag = 1;
  220.       break;
  221.     case 'E':
  222.       Eflag = 1;
  223.       break;
  224.     case 'p':
  225.       pflag = 1;
  226.       privname = optarg;
  227.       break;
  228.     case 'd':
  229.       dflag = 1;
  230.       dname = optarg;
  231.       break;
  232.     case 'a':
  233.       aflag = 1;
  234.       break;
  235.     case 'l':
  236.       lflag = 1;
  237.       break;
  238.     case 'S':
  239.       Sflag = 1;
  240.       break;
  241.     }
  242.     }
  243.  
  244.   if (optind < argc && argv[optind][0] == '+')
  245.     {
  246.       /* this is for traditional spell - add words in
  247.          * named file to OK list
  248.          */
  249.       (void) p_load (argv[optind] + 1, 0);
  250.       optind++;
  251.     }
  252.  
  253.   if (dflag == 0)
  254.     {
  255.       dname = (char *) getenv ("ISPELL_DICTIONARY");
  256.       if (dname == NULL)
  257.     {
  258. #ifdef DEFAULT_EXEDIR
  259. #ifdef __GNUC__
  260.       fprintf (stderr, "can't open dictionary -- argv[0] is not supported");
  261.       exit (1) ;
  262. #endif
  263.       strcpy ( dict_lib , argv[0] ) ;
  264.       * rindex ( dict_lib , PATH_SEP )  = '\0' ;
  265. #endif /* DEFAULT_EXEDIR */
  266.       dname = (char *) xmalloc ((unsigned) strlen (dict_lib) + 30);
  267.       (void) strcpy (dname, dict_lib);
  268.       (void) strcat (dname, PATH_SEPS ) ;
  269.       (void) strcat (dname, "ispell.dict");
  270.     }
  271.     }
  272.  
  273.   if (access (dname, 4) < 0)
  274.     {
  275.       (void) fprintf (stderr, "can't read dictionary %s\n", dname);
  276.       exit (1);
  277.     }
  278.  
  279.   if (!Dflag && !Eflag && !Sflag && !aflag && !lflag)
  280.     show_signon ();
  281.  
  282.   if (hash_init (dname) < 0)
  283.     {
  284.       (void) fprintf (stderr, "hash_init failed\n");
  285.       exit (1);
  286.     }
  287.  
  288.   if (hflag)
  289.     {
  290.       prhashchain ();
  291.       exit (0);
  292.     }
  293.  
  294.   if (Dflag)
  295.     {
  296.       hash_awrite (stdout);
  297.       exit (0);
  298.     }
  299.  
  300.   if (Eflag)
  301.     {
  302.       hash_ewrite (stdout);
  303.       exit (0);
  304.     }
  305.  
  306.   if (pflag == 0)
  307.     {
  308.       if ((p = (char *) getenv ("HOME")) != NULL)
  309.     {
  310.       privname = (char *) xmalloc ((unsigned) (strlen (p) + 50));
  311.       (void) strcpy (privname, p);
  312.       (void) strcat (privname, "/ispell.words");
  313.     }
  314.     }
  315.  
  316.   if (privname)
  317.     (void) p_load (privname, 1);
  318.  
  319.   if (Sflag)
  320.     {
  321.       submode ();
  322.     }
  323.   else if (aflag)
  324.     {
  325.       askmode (0);
  326.     }
  327.   else if (uflag)
  328.     {
  329.       spellmode (argc, argv, optind);
  330.       exit (0);
  331.     }
  332.   else if (lflag)
  333.     {
  334.       checkfile (stdin, (FILE *) NULL, (long) 0);
  335.       exit (0);
  336.     }
  337.   else
  338.     {
  339.       /* normal interactive mode */
  340.       if (optind == argc)
  341.     {
  342.       askmode (1);
  343.       exit (0);
  344.     }
  345.       signal (SIGINT, (RETSIGTYPE (*)()) intr);
  346.       terminit ();
  347.       while (optind < argc)
  348.     dofile (argv[optind++]);
  349.  
  350.       if (interaction_flag == 0)
  351.     printf ("No errors detected\r\n");
  352.     }
  353.  
  354.   if (privname)
  355.     (void) p_dump (privname);
  356.  
  357.   done ();
  358.   exit (0);
  359. }
  360.  
  361. extern struct sp_corrections corrections;
  362. static char stdoutbuf[BUFSIZ];
  363.  
  364. void
  365. submode (NOARGS)
  366. {
  367.   char buf[BUFSIZ];
  368.   int i;
  369.   int c;
  370.   int len;
  371.  
  372.   signal (SIGINT, SIG_IGN);
  373.   setbuf (stdin, (char *) NULL);
  374.   setbuf (stdout, stdoutbuf);
  375.   (void) printf ("(1 \"%s\")", VERSION_STRING);
  376.  
  377.   while (1)
  378.     {
  379.     again:
  380.       intr_typed = 0;
  381.       putchar ('=');
  382.       fflush (stdout);
  383.  
  384.       if (fgets (buf, sizeof buf, stdin) == NULL)
  385.     break;
  386.       len = strlen (buf);
  387.       if (len && buf[len - 1] == '\n')
  388.     {
  389.       buf[--len] = 0;
  390.     }
  391.       else
  392.     {
  393.       /* line was too long to hold newline -
  394.              * just return an error without otherwise
  395.              * looking at it
  396.              */
  397.       while (1)
  398.         {
  399.           if ((c = getchar ()) == EOF)
  400.         return;
  401.           if (c == '\n')
  402.         {
  403.           (void) printf ("nil\n");
  404.           goto again;
  405.         }
  406.         }
  407.     }
  408.       if (buf[0] == 0)
  409.     continue;
  410.  
  411.       if (buf[0] == ':')
  412.     {
  413.       if (subcmd (buf) < 0)
  414.         (void) printf ("nil\n");
  415.       else
  416.         (void) printf ("t\n");
  417.       continue;
  418.     }
  419.       if (good (buf, strlen (buf), 0))
  420.     {
  421.       (void) printf ("t\n");
  422.     }
  423.       else
  424.     {
  425.       makepossibilities (buf);
  426.       if (corrections.posbuf[0][0])
  427.         {
  428.           (void) printf ("(");
  429.           for (i = 0; i < 10; i++)
  430.         {
  431.           if (corrections.posbuf[i][0] == 0)
  432.             break;
  433.           (void) printf ("\"%s\" ",
  434.                  corrections.posbuf[i]);
  435.         }
  436.           (void) printf (")\n");
  437.         }
  438.       else
  439.         {
  440.           (void) printf ("nil\n");
  441.         }
  442.     }
  443.     }
  444. }
  445.  
  446. struct cmd
  447. {
  448.   char *name;
  449. #ifdef __STDC__
  450.   int (*func) (char *);
  451. #else
  452.   int (*func) ();
  453. #endif
  454. };
  455.  
  456. extern struct cmd subcmds[];
  457.  
  458. int
  459. subcmd (buf)
  460.   char *buf;
  461. {
  462.   char *p;
  463.   struct cmd *cp;
  464.  
  465.   buf++;                        /* skip colon */
  466.   for (p = buf; *p && !isspace (*p); p++)
  467.     ;
  468.   if (*p)
  469.     *p++ = 0;
  470.  
  471.   for (cp = subcmds; cp->name; cp++)
  472.     if (strcmp (cp->name, buf) == 0)
  473.       break;
  474.   if (cp->name == NULL)
  475.     return (-1);
  476.  
  477.   return ((*cp->func) (p));
  478. }
  479.  
  480.  
  481. int
  482. cmd_insert (arg)
  483.      char *arg;
  484. {
  485.   return (p_enter (arg, 1, 1));
  486. }
  487.  
  488.  
  489. int
  490. cmd_accept (arg)
  491.   char *arg;
  492. {
  493.   return (p_enter (arg, 1, 0));
  494. }
  495.  
  496.  
  497. int
  498. cmd_delete (arg)
  499.   char *arg;
  500. {
  501.   return (p_delete (arg));
  502. }
  503.  
  504.  
  505. int
  506. cmd_dump (arg)
  507.   char *arg;
  508. {
  509.   if (privname)
  510.     return (p_dump (privname));
  511.   else
  512.     return (-1);
  513. }
  514.  
  515. /* ARGSUSED */
  516. int
  517. cmd_reload (arg)
  518.   char *arg;
  519. {
  520.   return p_reload ();
  521. }
  522.  
  523.  
  524. int
  525. cmd_file (arg)
  526.   char *arg;
  527. {
  528.   FILE *f;
  529.   long start, end;
  530.   char *p;
  531.  
  532.   for (p = arg; *p && !isspace (*p); p++)
  533.     ;
  534.   if (*p)
  535.     *p++ = 0;
  536.  
  537.   start = 0;
  538.   end = 0;
  539.  
  540.   sscanf (p, "%ld %ld", &start, &end);
  541.  
  542.   if ((f = fopen (arg, "r")) == NULL)
  543.     return -1;
  544.  
  545.   if (fseek (f, start, 0) < 0)
  546.     {
  547.       (void) fclose (f);
  548.       return (-1);
  549.     }
  550.  
  551.   signal (SIGINT, (RETSIGTYPE (*)()) intr);
  552.   checkfile (f, (FILE *) NULL, end);
  553.   signal (SIGINT, SIG_IGN);
  554.  
  555.   (void) fclose (f);
  556.   if (intr_typed)
  557.     {
  558.       intr_typed = 0;
  559.       return (-1);
  560.     }
  561.   else
  562.     {
  563.       return (0);
  564.     }
  565. }
  566.  
  567. /* ARGSUSED */
  568. int
  569. cmd_tex (arg)
  570.   char *arg;
  571. {
  572.   formatter = formatter_tex;
  573.   return (0);
  574. }
  575.  
  576. /* ARGSUSED */
  577. int
  578. cmd_troff (arg)
  579.   char *arg;
  580. {
  581.   formatter = formatter_troff;
  582.   return (0);
  583. }
  584.  
  585. /* ARGUSED */
  586. int
  587. cmd_generic (arg)
  588.   char *arg;
  589. {
  590.   formatter = formatter_generic;
  591.   return (0);
  592. }
  593.  
  594.  
  595. void
  596. spellmode (ac, av, ind)
  597.   char **av;
  598.   int ac, ind;
  599. {
  600.   FILE *f;
  601.  
  602. #ifdef NO_PIPE
  603.   /* works with BorlandC. I did not chek other MSDOS compiler --Ganelin */
  604.   char * tempfile =  mktemp ( "prXXXXXX" ) ;
  605.   sortf =  fopen ( tempfile , "wt" ) ;
  606. #else
  607.   sortf = (FILE *) popen ("sort", "w");
  608. #endif
  609.   if (sortf == NULL)
  610.     {
  611.       (void) fprintf (stderr, "can't exec 'sort' program\n");
  612.       exit (1);
  613.     }
  614.   if (ac == ind)
  615.     {
  616.       checkfile (stdin, (FILE *) NULL, (long) 0);
  617.     }
  618.   else
  619.     {
  620.       while (ind < ac)
  621.     {
  622.       f = fopen (av[ind], "r");
  623.       if (f == NULL)
  624.         {
  625.           (void) fprintf (stderr, "can't open %s\n", av[ind]);
  626.         }
  627.       else
  628.         {
  629.           checkfile (f, (FILE *) NULL, (long) 0);
  630.           (void) fclose (f);
  631.         }
  632.       ind++;
  633.     }
  634.     }
  635. #ifdef NO_PIPE
  636.  
  637.   if ( fclose ( sortf ) )
  638.     {
  639.       (void) fprintf (stderr, "can't exec 'sort' program. tempfile failed \n");
  640.       exit (1);
  641.     }
  642.   ;
  643.   sortf = fopen ( tempfile , "rt" ) ;
  644.   close ( 0 ) ;  /* 0 = STD_IN */ ;
  645.   dup ( fileno ( sortf ) ) ;
  646.   if ( spawnlp ( P_WAIT ,    "sort.exe"  ,  0 ) )
  647.           perror ( "shellfun:" ) ;
  648.   fclose ( sortf ) ;
  649.   unlink ( tempfile ) ;
  650. #else
  651.   (void) pclose (sortf);        /* needed to wait for sort to finish */
  652. #endif
  653. }
  654.  
  655.  
  656. struct cmd subcmds[] =
  657. {
  658.   {"insert", cmd_insert},
  659.   {"accept", cmd_accept},
  660.   {"delete", cmd_delete},
  661.   {"dump", cmd_dump},
  662.   {"reload", cmd_reload},
  663.   {"file", cmd_file},
  664.   {"tex", cmd_tex},
  665.   {"troff", cmd_troff},
  666.   {"generic", cmd_generic},
  667.   {NULL}
  668. };
  669.  
  670. #define p(str) printf("%s\n", str)
  671.  
  672. static void
  673. show_signon ()
  674. {
  675.   printf ("%s.\n", VERSION_STRING);
  676.   p ("Copyright (C) 1990, 1993 Free Software Foundation, Inc.");
  677.   p ("Ispell comes with ABSOLUTELY NO WARRANTY; for details run \"ispell -W\"");
  678.   p ("This is free software, and you are welcome to redistribute it");
  679.   p ("under certain conditions; run \"ispell -C\" for details.");
  680. }
  681.  
  682.  
  683. static void
  684. show_copying ()
  685. {
  686.   p ("            GNU GENERAL PUBLIC LICENSE");
  687.   p ("               Version 2, June 1991");
  688.   p ("");
  689.   p (" Copyright (C) 1989, 1991 Free Software Foundation, Inc.");
  690.   p ("                          675 Mass Ave, Cambridge, MA 02139, USA");
  691.   p (" Everyone is permitted to copy and distribute verbatim copies");
  692.   p (" of this license document, but changing it is not allowed.");
  693.   p ("");
  694.   p ("                Preamble");
  695.   p ("");
  696.   p ("  The licenses for most software are designed to take away your");
  697.   p ("freedom to share and change it.  By contrast, the GNU General Public");
  698.   p ("License is intended to guarantee your freedom to share and change free");
  699.   p ("software--to make sure the software is free for all its users.  This");
  700.   p ("General Public License applies to most of the Free Software");
  701.   p ("Foundation's software and to any other program whose authors commit to");
  702.   p ("using it.  (Some other Free Software Foundation software is covered by");
  703.   p ("the GNU Library General Public License instead.)  You can apply it to");
  704.   p ("your programs, too.");
  705.   p ("");
  706.   p ("  When we speak of free software, we are referring to freedom, not");
  707.   p ("price.  Our General Public Licenses are designed to make sure that you");
  708.   p ("have the freedom to distribute copies of free software (and charge for");
  709.   p ("this service if you wish), that you receive source code or can get it");
  710.   p ("if you want it, that you can change the software or use pieces of it");
  711.   p ("in new free programs; and that you know you can do these things.");
  712.   p ("");
  713.   p ("  To protect your rights, we need to make restrictions that forbid");
  714.   p ("anyone to deny you these rights or to ask you to surrender the rights.");
  715.   p ("These restrictions translate to certain responsibilities for you if you");
  716.   p ("distribute copies of the software, or if you modify it.");
  717.   p ("");
  718.   p ("  For example, if you distribute copies of such a program, whether");
  719.   p ("gratis or for a fee, you must give the recipients all the rights that");
  720.   p ("you have.  You must make sure that they, too, receive or can get the");
  721.   p ("source code.  And you must show them these terms so they know their");
  722.   p ("rights.");
  723.   p ("");
  724.   p ("  We protect your rights with two steps: (1) copyright the software, and");
  725.   p ("(2) offer you this license which gives you legal permission to copy,");
  726.   p ("distribute and/or modify the software.");
  727.   p ("");
  728.   p ("  Also, for each author's protection and ours, we want to make certain");
  729.   p ("that everyone understands that there is no warranty for this free");
  730.   p ("software.  If the software is modified by someone else and passed on, we");
  731.   p ("want its recipients to know that what they have is not the original, so");
  732.   p ("that any problems introduced by others will not reflect on the original");
  733.   p ("authors' reputations.");
  734.   p ("");
  735.   p ("  Finally, any free program is threatened constantly by software");
  736.   p ("patents.  We wish to avoid the danger that redistributors of a free");
  737.   p ("program will individually obtain patent licenses, in effect making the");
  738.   p ("program proprietary.  To prevent this, we have made it clear that any");
  739.   p ("patent must be licensed for everyone's free use or not licensed at all.");
  740.   p ("");
  741.   p ("  The precise terms and conditions for copying, distribution and");
  742.   p ("modification follow.");
  743.   p (" ");
  744.   p ("            GNU GENERAL PUBLIC LICENSE");
  745.   p ("   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION");
  746.   p ("");
  747.   p ("  0. This License applies to any program or other work which contains");
  748.   p ("a notice placed by the copyright holder saying it may be distributed");
  749.   p ("under the terms of this General Public License.  The \"Program\", below,");
  750.   p ("refers to any such program or work, and a \"work based on the Program\"");
  751.   p ("means either the Program or any derivative work under copyright law:");
  752.   p ("that is to say, a work containing the Program or a portion of it,");
  753.   p ("either verbatim or with modifications and/or translated into another");
  754.   p ("language.  (Hereinafter, translation is included without limitation in");
  755.   p ("the term \"modification\".)  Each licensee is addressed as \"you\".");
  756.   p ("");
  757.   p ("Activities other than copying, distribution and modification are not");
  758.   p ("covered by this License; they are outside its scope.  The act of");
  759.   p ("running the Program is not restricted, and the output from the Program");
  760.   p ("is covered only if its contents constitute a work based on the");
  761.   p ("Program (independent of having been made by running the Program).");
  762.   p ("Whether that is true depends on what the Program does.");
  763.   p ("");
  764.   p ("  1. You may copy and distribute verbatim copies of the Program's");
  765.   p ("source code as you receive it, in any medium, provided that you");
  766.   p ("conspicuously and appropriately publish on each copy an appropriate");
  767.   p ("copyright notice and disclaimer of warranty; keep intact all the");
  768.   p ("notices that refer to this License and to the absence of any warranty;");
  769.   p ("and give any other recipients of the Program a copy of this License");
  770.   p ("along with the Program.");
  771.   p ("");
  772.   p ("You may charge a fee for the physical act of transferring a copy, and");
  773.   p ("you may at your option offer warranty protection in exchange for a fee.");
  774.   p ("");
  775.   p ("  2. You may modify your copy or copies of the Program or any portion");
  776.   p ("of it, thus forming a work based on the Program, and copy and");
  777.   p ("distribute such modifications or work under the terms of Section 1");
  778.   p ("above, provided that you also meet all of these conditions:");
  779.   p ("");
  780.   p ("    a) You must cause the modified files to carry prominent notices");
  781.   p ("    stating that you changed the files and the date of any change.");
  782.   p ("");
  783.   p ("    b) You must cause any work that you distribute or publish, that in");
  784.   p ("    whole or in part contains or is derived from the Program or any");
  785.   p ("    part thereof, to be licensed as a whole at no charge to all third");
  786.   p ("    parties under the terms of this License.");
  787.   p ("");
  788.   p ("    c) If the modified program normally reads commands interactively");
  789.   p ("    when run, you must cause it, when started running for such");
  790.   p ("    interactive use in the most ordinary way, to print or display an");
  791.   p ("    announcement including an appropriate copyright notice and a");
  792.   p ("    notice that there is no warranty (or else, saying that you provide");
  793.   p ("    a warranty) and that users may redistribute the program under");
  794.   p ("    these conditions, and telling the user how to view a copy of this");
  795.   p ("    License.  (Exception: if the Program itself is interactive but");
  796.   p ("    does not normally print such an announcement, your work based on");
  797.   p ("    the Program is not required to print an announcement.)");
  798.   p (" ");
  799.   p ("These requirements apply to the modified work as a whole.  If");
  800.   p ("identifiable sections of that work are not derived from the Program,");
  801.   p ("and can be reasonably considered independent and separate works in");
  802.   p ("themselves, then this License, and its terms, do not apply to those");
  803.   p ("sections when you distribute them as separate works.  But when you");
  804.   p ("distribute the same sections as part of a whole which is a work based");
  805.   p ("on the Program, the distribution of the whole must be on the terms of");
  806.   p ("this License, whose permissions for other licensees extend to the");
  807.   p ("entire whole, and thus to each and every part regardless of who wrote it.");
  808.   p ("");
  809.   p ("Thus, it is not the intent of this section to claim rights or contest");
  810.   p ("your rights to work written entirely by you; rather, the intent is to");
  811.   p ("exercise the right to control the distribution of derivative or");
  812.   p ("collective works based on the Program.");
  813.   p ("");
  814.   p ("In addition, mere aggregation of another work not based on the Program");
  815.   p ("with the Program (or with a work based on the Program) on a volume of");
  816.   p ("a storage or distribution medium does not bring the other work under");
  817.   p ("the scope of this License.");
  818.   p ("");
  819.   p ("  3. You may copy and distribute the Program (or a work based on it,");
  820.   p ("under Section 2) in object code or executable form under the terms of");
  821.   p ("Sections 1 and 2 above provided that you also do one of the following:");
  822.   p ("");
  823.   p ("    a) Accompany it with the complete corresponding machine-readable");
  824.   p ("    source code, which must be distributed under the terms of Sections");
  825.   p ("    1 and 2 above on a medium customarily used for software interchange; or,");
  826.   p ("");
  827.   p ("    b) Accompany it with a written offer, valid for at least three");
  828.   p ("    years, to give any third party, for a charge no more than your");
  829.   p ("    cost of physically performing source distribution, a complete");
  830.   p ("    machine-readable copy of the corresponding source code, to be");
  831.   p ("    distributed under the terms of Sections 1 and 2 above on a medium");
  832.   p ("    customarily used for software interchange; or,");
  833.   p ("");
  834.   p ("    c) Accompany it with the information you received as to the offer");
  835.   p ("    to distribute corresponding source code.  (This alternative is");
  836.   p ("    allowed only for noncommercial distribution and only if you");
  837.   p ("    received the program in object code or executable form with such");
  838.   p ("    an offer, in accord with Subsection b above.)");
  839.   p ("");
  840.   p ("The source code for a work means the preferred form of the work for");
  841.   p ("making modifications to it.  For an executable work, complete source");
  842.   p ("code means all the source code for all modules it contains, plus any");
  843.   p ("associated interface definition files, plus the scripts used to");
  844.   p ("control compilation and installation of the executable.  However, as a");
  845.   p ("special exception, the source code distributed need not include");
  846.   p ("anything that is normally distributed (in either source or binary");
  847.   p ("form) with the major components (compiler, kernel, and so on) of the");
  848.   p ("operating system on which the executable runs, unless that component");
  849.   p ("itself accompanies the executable.");
  850.   p ("");
  851.   p ("If distribution of executable or object code is made by offering");
  852.   p ("access to copy from a designated place, then offering equivalent");
  853.   p ("access to copy the source code from the same place counts as");
  854.   p ("distribution of the source code, even though third parties are not");
  855.   p ("compelled to copy the source along with the object code.");
  856.   p (" ");
  857.   p ("  4. You may not copy, modify, sublicense, or distribute the Program");
  858.   p ("except as expressly provided under this License.  Any attempt");
  859.   p ("otherwise to copy, modify, sublicense or distribute the Program is");
  860.   p ("void, and will automatically terminate your rights under this License.");
  861.   p ("However, parties who have received copies, or rights, from you under");
  862.   p ("this License will not have their licenses terminated so long as such");
  863.   p ("parties remain in full compliance.");
  864.   p ("");
  865.   p ("  5. You are not required to accept this License, since you have not");
  866.   p ("signed it.  However, nothing else grants you permission to modify or");
  867.   p ("distribute the Program or its derivative works.  These actions are");
  868.   p ("prohibited by law if you do not accept this License.  Therefore, by");
  869.   p ("modifying or distributing the Program (or any work based on the");
  870.   p ("Program), you indicate your acceptance of this License to do so, and");
  871.   p ("all its terms and conditions for copying, distributing or modifying");
  872.   p ("the Program or works based on it.");
  873.   p ("");
  874.   p ("  6. Each time you redistribute the Program (or any work based on the");
  875.   p ("Program), the recipient automatically receives a license from the");
  876.   p ("original licensor to copy, distribute or modify the Program subject to");
  877.   p ("these terms and conditions.  You may not impose any further");
  878.   p ("restrictions on the recipients' exercise of the rights granted herein.");
  879.   p ("You are not responsible for enforcing compliance by third parties to");
  880.   p ("this License.");
  881.   p ("");
  882.   p ("  7. If, as a consequence of a court judgment or allegation of patent");
  883.   p ("infringement or for any other reason (not limited to patent issues),");
  884.   p ("conditions are imposed on you (whether by court order, agreement or");
  885.   p ("otherwise) that contradict the conditions of this License, they do not");
  886.   p ("excuse you from the conditions of this License.  If you cannot");
  887.   p ("distribute so as to satisfy simultaneously your obligations under this");
  888.   p ("License and any other pertinent obligations, then as a consequence you");
  889.   p ("may not distribute the Program at all.  For example, if a patent");
  890.   p ("license would not permit royalty-free redistribution of the Program by");
  891.   p ("all those who receive copies directly or indirectly through you, then");
  892.   p ("the only way you could satisfy both it and this License would be to");
  893.   p ("refrain entirely from distribution of the Program.");
  894.   p ("");
  895.   p ("If any portion of this section is held invalid or unenforceable under");
  896.   p ("any particular circumstance, the balance of the section is intended to");
  897.   p ("apply and the section as a whole is intended to apply in other");
  898.   p ("circumstances.");
  899.   p ("");
  900.   p ("It is not the purpose of this section to induce you to infringe any");
  901.   p ("patents or other property right claims or to contest validity of any");
  902.   p ("such claims; this section has the sole purpose of protecting the");
  903.   p ("integrity of the free software distribution system, which is");
  904.   p ("implemented by public license practices.  Many people have made");
  905.   p ("generous contributions to the wide range of software distributed");
  906.   p ("through that system in reliance on consistent application of that");
  907.   p ("system; it is up to the author/donor to decide if he or she is willing");
  908.   p ("to distribute software through any other system and a licensee cannot");
  909.   p ("impose that choice.");
  910.   p ("");
  911.   p ("This section is intended to make thoroughly clear what is believed to");
  912.   p ("be a consequence of the rest of this License.");
  913.   p (" ");
  914.   p ("  8. If the distribution and/or use of the Program is restricted in");
  915.   p ("certain countries either by patents or by copyrighted interfaces, the");
  916.   p ("original copyright holder who places the Program under this License");
  917.   p ("may add an explicit geographical distribution limitation excluding");
  918.   p ("those countries, so that distribution is permitted only in or among");
  919.   p ("countries not thus excluded.  In such case, this License incorporates");
  920.   p ("the limitation as if written in the body of this License.");
  921.   p ("");
  922.   p ("  9. The Free Software Foundation may publish revised and/or new versions");
  923.   p ("of the General Public License from time to time.  Such new versions will");
  924.   p ("be similar in spirit to the present version, but may differ in detail to");
  925.   p ("address new problems or concerns.");
  926.   p ("");
  927.   p ("Each version is given a distinguishing version number.  If the Program");
  928.   p ("specifies a version number of this License which applies to it and \"any");
  929.   p ("later version\", you have the option of following the terms and conditions");
  930.   p ("either of that version or of any later version published by the Free");
  931.   p ("Software Foundation.  If the Program does not specify a version number of");
  932.   p ("this License, you may choose any version ever published by the Free Software");
  933.   p ("Foundation.");
  934.   p ("");
  935.   p ("  10. If you wish to incorporate parts of the Program into other free");
  936.   p ("programs whose distribution conditions are different, write to the author");
  937.   p ("to ask for permission.  For software which is copyrighted by the Free");
  938.   p ("Software Foundation, write to the Free Software Foundation; we sometimes");
  939.   p ("make exceptions for this.  Our decision will be guided by the two goals");
  940.   p ("of preserving the free status of all derivatives of our free software and");
  941.   p ("of promoting the sharing and reuse of software generally.");
  942.   p ("");
  943. }
  944.  
  945.  
  946. static void
  947. show_warranty ()
  948. {
  949.   p ("                NO WARRANTY");
  950.   p ("");
  951.   p ("  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY");
  952.   p ("FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN");
  953.   p ("OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES");
  954.   p ("PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED");
  955.   p ("OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF");
  956.   p ("MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS");
  957.   p ("TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE");
  958.   p ("PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,");
  959.   p ("REPAIR OR CORRECTION.");
  960.   p ("");
  961.   p ("  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING");
  962.   p ("WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR");
  963.   p ("REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,");
  964.   p ("INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING");
  965.   p ("OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED");
  966.   p ("TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY");
  967.   p ("YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER");
  968.   p ("PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE");
  969.   p ("POSSIBILITY OF SUCH DAMAGES.");
  970.   p ("");
  971. }
  972.